home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / Internet Chooser / reggie / basic / store.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-06-22  |  3.0 KB  |  113 lines  |  [TEXT/MMCC]

  1. /* File "store.cpp", Light Sockets - Copyright (C) Matt Slot, 1996            */
  2. /* Consolidated data storage class                                            */
  3.  
  4. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  5. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  6. /* Include Files */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11.  
  12. #include "stdtypes.h"
  13.  
  14. #include "store.h"
  15.  
  16. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  17. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  18.  
  19. c_store::c_store(UInt32 elem_size) {
  20.     
  21.     size = elem_size;
  22.     count = 0;
  23.     data_ptr = 0;
  24.     }
  25.  
  26. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  27. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  28.  
  29. c_store::~c_store() {
  30.     if (data_ptr) free(data_ptr);
  31.     data_ptr = 0;
  32.     count = 0;
  33.     }
  34.  
  35. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  36. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  37. #pragma mark -
  38.  
  39. SInt32 c_store::insert_elem(Byte8 *new_data, UInt32 insert_before) {
  40.     Byte8 *new_ptr, *temp_ptr;
  41.     
  42.     new_ptr = (Byte8 *) malloc(size * (count+1));
  43.     if (! new_ptr) return(-1);
  44.     
  45.     if (count) {
  46.         if (insert_before > count) insert_before = count;
  47.           else if (insert_before < 0) insert_before = 0;
  48.  
  49.         memcpy(new_ptr, data_ptr, insert_before * size);
  50.         memcpy(new_ptr + (insert_before * size), new_data, size);
  51.         memcpy(new_ptr + ((insert_before+1) * size), 
  52.                     data_ptr + (insert_before * size),
  53.                     (count - insert_before) * size);
  54.         }
  55.       else memcpy(new_ptr, new_data, size);
  56.         
  57.     temp_ptr = data_ptr;
  58.     data_ptr = new_ptr;    
  59.     count++;
  60.     if (temp_ptr) free(temp_ptr);
  61.  
  62.     return(0);
  63.     }
  64.  
  65. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  66. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  67.  
  68. SInt32 c_store::remove_elem(UInt32 index) {
  69.     Byte8 *new_ptr, *temp_ptr;
  70.     
  71.     if (count>1) {
  72.         new_ptr = (Byte8 *) malloc(size * (count-1));
  73.         if (! new_ptr) return(-1);
  74.     
  75.         if (index >= count) index = count-1;
  76.           else if (index < 0) index = 0;
  77.  
  78.         memcpy(new_ptr, data_ptr, index * size);
  79.         memcpy(new_ptr + (index * size), data_ptr + ((index+1) * size),
  80.                 (count - index - 1) * size);
  81.         }
  82.       else new_ptr = 0;
  83.         
  84.     count--;
  85.     temp_ptr = data_ptr;
  86.     data_ptr = new_ptr;    
  87.     if (temp_ptr) free(temp_ptr);
  88.  
  89.     return(0);
  90.     }
  91.  
  92. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  93. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  94.  
  95. SInt32 c_store::remove_all() {
  96.     if (data_ptr) free(data_ptr);
  97.     data_ptr = 0;
  98.     count = 0;
  99.  
  100.     return(0);
  101.     }
  102.  
  103. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  104. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  105.  
  106. Byte8 * c_store::get_nth_elem(UInt32 index) {
  107.  
  108.     if (index < 0) return(0);
  109.     if (index >= count) return(0);
  110.     return(data_ptr + (index * size));
  111.     }
  112.  
  113.